Series 的选择与转换
明确的选择方式
import pandas as pd
s = pd.Series([90, 80, 70], index=["Ada", "Lin", "Sam"], dtype="float64")
s.loc["Ada"] # 单个标签
s.loc[["Ada", "Sam"]] # 多个标签
s.iloc[0] # 第一个位置
s.iloc[:3] # 前三个位置
s[s.ge(80)] # 布尔筛选
处理标签用 .loc,处理位置用 .iloc。特别是当索引本身是整数时,混用容易出错。虽然 s[key] 在标签无歧义时更简洁,但显式使用索引器能更清晰地表达意图,且在索引结构变化时更稳健。
转换操作的优先级
- 优先使用原生向量化算术,或字符串/日期时间访问器。
- 标量查找或逐元素函数使用
map。 - 条件替换使用
where、mask、replace或fillna。 - 仅当没有更清晰的向量化操作时,才使用
apply。
normalized = (s - s.mean()) / s.std()
bands = s.map({90: "A", 80: "B"})
clipped = s.clip(lower=0)
注意:map 传入字典时,未匹配的值会变成缺失值(NaN)。如果希望未匹配的值保持原样,请使用 replace。
合并 Series
使用 pd.concat 进行纵向堆叠或横向拼接:
train, test = s.iloc[:2], s.iloc[2:]
actual, predicted = s, s + 5
stacked = pd.concat([train, test], ignore_index=True)
table = pd.concat([actual.rename("actual"), predicted.rename("predicted")], axis=1)
Series.append 已废弃,不是标准的合并 API。在进行列向拼接(axis=1)前,务必确认是否期望按标签对齐。
迭代
如果确实必须迭代,s.items() 会生成 (标签, 值) 对。
切勿使用迭代进行算术运算或常规筛选;向量化表达式不仅更清晰,性能通常也更好。
结果与统计假设
本例中,s.loc["Ada"] 返回标量 90.0,选择两个标签返回长度为 2 的 Series,筛选保留 Ada 和 Lin。转换操作返回新的 Series,不修改 s。bands 依次为 "A"、"B" 和缺失值;它按数值精确查表,不是按分数区间划档。
Series.std 默认使用样本分母(ddof=1),因此均值为 80,标准差为 10,normalized 为 [1.0, 0.0, -1.0]。总体标准差用 ddof=0。常量序列的标准差为零;有效值少于两个时,样本标准差无法定义。除法前应明确这些情况如何处理。